2019年NLP的高光时刻,会从NL2SQL开始么?
自2015年新一轮人工智能浪潮涌起,先是视觉、语音各领风骚,小火慢炖的NLP从2018下半年开始,也走入了高光时刻:BERT、GPT-2.0等一系列里程碑意义的模型横空出世,创新应用场景次第打开。
2019年,NLP又会给大家带来哪些惊喜呢?
作为智能语义的领跑者,追一科技一直在探索NLP的前沿技术创新。此前,我们分享了阅读理解、BERT、基于NLP的AI平台应用等前沿科技,获得了广泛关注。今天,我们将为大家带来一个NLP探索的新秘境:NL2SQL,通过自然语言自由地查询数据库。
这将是一个怎样的语义世界?当NLP遇上数据库,将会碰撞出怎样的火花?
敬请关注,文末有彩蛋。
NL2SQL:当NLP唤醒数据库
在AI、区块链、IoT、AR等高新技术飞速发展的当下,数据库这一宝库似乎被大家遗忘在了角落。数据库存储了大量的个人或者企业的生产运营数据,我们每天都会和数据库产生或多或少的交互。通常,如果想要查询数据库中的数据,需要通过像SQL这样的程序式查询语言来进行交互,这就需要懂SQL语言的专业技术人员来执行这一操作。
为了让非专业用户也可以按需查询数据库,当前流行的技术方案设计了基于条件筛选的专门界面,用户可以通过点选不同的条件来查询数据库,比如这个筛选汽车的界面。
然而,在这个界面上进行操作,极大地限定了数据库查询的使用场景和查询界限。同时,即使是对于精通数据库程序语言的专业人士,经常构思SQL语句、维护这样一个查询界面也是一项重复度较高的工作。
在CUI(Conversation User Interface)的大背景下, 如何通过自然语言自由地查询数据库中的目标数据成为了新兴的研究热点。Natural Language to SQL( NL2SQL)就是这样的一项技术,可以将用户的自然语句转为可以执行的SQL语句。
Nothing is better than an example.针对上面这样一张数据库表格,用户可能会想知道“宝马的车总共卖了多少量?”,其相应的SQL表达式是“SELECT SUM(销量) FROM TABLE WHERE 品牌==”宝马”;”,而NL2SQL做的,就是结合用户想要查询的表格,将用户的问句转化为相应的SQL语句,从而得到答案“8”。
表格数据,是信息在经过人为整理、归纳后的一种高效的结构化表达形式,信息的价值、密度和质量高于普通的文字文本。用很多文字才能描述清楚的信息,可能一张表格就够了。在行业研报、业绩报告、新闻公告、使用说明书等各种书面信息载体上,尤其是金融、快消等行业的各种报告,充斥着许多表格形式的结构化数据。
而当用户去查询表格中的内容时,需要肉眼去从表格中去筛选满足条件的数据,准确率和效率都较低。通过NL2SQL,用户在查询这些表格的内容时,可以直接通过自然语言与表格进行交互,并得到结果,用户体验会很自然。比如下面这张出自于某房地产行业研报的表格:
针对这张表格,用户可能会想问“哪些城市的全月销量同比超过了50%或者当日环比大于25%?相应的房产类型和销售面积情况如何?”这样的问题,经过NL2SQL模型,可以直接得到相应的SQL语句“select 城市, 类型, 全月数值(万平) from table where 全月同比(%) > 50 or 当日环比(%) > 25”,进一步返回执行该SQL语句后的如下结果。
如今,在很多日常应用场景中,用户都会和数据库进行交互,比如订餐、订票、查天气、查报表等等,绝大部分的解决方案也是通过输入条件和点选条件来进行查询。即使部分场景已经进行了技术升级,可以通过对话机器人的方式来进行交互,但其背后仍然是预设了不同的条件入口,需要模型通过一系列的实体识别、槽值提取等流程来填充预先规定好的SQL模板。对于这样的方案,不仅查询的信息和筛选的条件会局限于预先设好的字段,而且这些功能模块的开发和维护需要大量的人力资源。如果使用NL2SQL的技术方案,那么用户与数据库之间的距离可以进一步缩短、用户可以更自由地查询更多的信息、表达自己更丰富的查询意图,还可以减轻目前技术方案的繁琐,解放程序员。
NL2SQL不仅可以独当一面,降低人与机器之间交互的距离和门槛,也可以与其它技术相辅相成。比如,现今的机器阅读理解技术,已经可以在SQUAD 1.0、SQUAD 2.0等数据集上全面超越人类水平,还可以在其它各种各样形式的数据集上寻找答案,像是多段落、多文档、抽取式答案、生成式答案等形式。但目前还不能对文章中出现的表格进行解读和寻找答案,如果用户想要的答案存在于文章中的表格,那么现有的模型就都束手无策了。但表格数据在真实场景中存在很多,而且表格中的数据都很有价值,用户也会经常针对其中的数据进行提问。
比如下图中的这一真实场景,用户如果想问“在哪些年里平均溢价率高于20%”,这样的问题,依靠现有的机器阅读理解技术,在文本中是找不到答案的,而通过NL2SQL就可以很好地弥补现有技术的不足,可以完善非结构化文本问答在真实落地场景中的应用,更可以充分发掘此类结构化数据的价值。
研报部分来源于东吴证券《房地产行业2019年度策略》
四大数据集,各有千秋
早在上世纪中后期,人们就已经在尝试开发通过自然语言直接访问数据库中存储数据的界面了NLIDB(Natural Language Interfaces to Databases),其中最知名的是上世纪六十年代的LUNAR系统,通过对问句的句式语法分析来回答关于从阿波罗任务中带回的月岩的地质学分析问题。再比如上世纪七十年代初的LADDER系统,已经支持通过一定的语义语言来从数据库提取信息。但这种系统中下对自然语言问题的解析并不依赖于句子的成分,这使得每一个具有特定知识的数据库都需要特定的语义语法,所以方法在普适性上不够完善。
限于当时技术发展,NLIDB面临很大的挑战,系统语言的支持上限以及对于语言的理解上限不明确、语言上逻辑和含义的歧义、生僻词的出现等,以及包括替代品的发展如Excel表格这种存储表格的新形式的出现,这些都极大限制了这个领域的发展。
直到2015年AI的复苏和自然语言处理的创新,人们才慢慢把关注拉回了NLIDB,如何利用自然语言更自然更自由的与数据库交互成为了新兴的研究热点。
那NL2SQL在学术中的定位是怎么样的呢?
NL2SQL这一任务的本质,是将用户的自然语言语句转化为计算机可以理解并执行的规范语义表示(formal meaning representation),是语义分析(Semantic Parsing)领域的一个子任务。NL2SQL是由自然语言生成SQL,那么自然也有NL2Bash、NL2Python、NL2Java等类似的研究。下面是来自NL2Bash Dataset的一条数据,
NL: Search for the string ’git’ in all the files under current directory tree without traversing into ’.git’ folder and excluding files that have ’git’ in their names.
Bash: find . -not -name ".git" -not -path "*.git*" -not –name "*git*" | xargs -I {} grep git {}
虽然生成的程序语言不同,但核心任务与NL2SQL相同,都是需要计算机理解自然语言语句,并生成准确表达语句语义的可执行程序式语言。广义来说,KBQA也与NL2SQL技术有着千丝万缕的联系,其背后的做法也是将用户的自然语言,转化为逻辑形式,只不过不同的是转化的逻辑形式是SPARQL,而不是SQL。通过生成的查询语句在知识图谱中的执行,进而可以直接得到用户的答案,进而可以提升算法引擎的用户体验。
图片来自于Google搜索
目前,NL2SQL方向已经有WikiSQL、Spider、WikiTableQuestions、ATIS等诸多公开数据集。不同数据集都有各自的特点,在这里分别来简单介绍一下这四个数据集。
WikiSQL是Salesforce在2017年提出的一个大型标注NL2SQL数据集,也是目前规模最大的NL2SQL数据集。其中包含了26,375张表、87,726条自然语言问句及相应的SQL语句。下图是其中的一条数据样例,包括一个table、一条SQL语句及该条SQL语句所对应的自然语言语句。
该数据集自提出之后,已经有17次公开提交。因为SQL的形式较为简单,不涉及到高级用法、Question所对应的正确表格已经给定、不需要联合多张表格等诸多问题的简化,目前在SQL执行结果准确率这一指标上已经达到了91.8%。
Spider是耶鲁大学在2018年新提出的一个较大规模的NL2SQL数据集。该数据集包含了10,181条自然语言问句、分布在200个独立数据库中的5,693条SQL,并且内容覆盖了138个不同的领域。虽然在数据数量上不如WikiSQL,但Spider引入了更多的SQL用法,例如Group By、Order By、Having,甚至需要Join不同表,这更贴近于真实场景,也带来了更大的难度。因此目前在榜单上,只有5次提交,在不考虑条件判断中value的情况下,准确率最高只有24.3,可见这个数据集的难度非常大。
下图是该数据集中的一条样例。在这个以College主题的数据库中,用户询问“讲师的工资高于平均工资水平的部门以及相应的预算是什么?”,模型需要根据用户的问题和已知的数据库中的各种表格、字段以及之间错综复杂的关系来生成正确的SQL。
WikiTableQuestions是斯坦佛大学于2015年提出的一个针对维基百科中那些半结构化表格问答的一个数据集,包含了22,033条真实问句以及2,108张表格。由于数据的来源是维基百科,因此表格中的数据是真实且没有经过归一化的,一个cell内可能包含多个实体或含义,比如“Beijing, China” or “200 km”;同时,为了可以很好地泛化到其它领域的数据,该数据集在测试集中的表格主题和实体之间的关系都是在训练集中没有见到过的。下图是该数据集中的一条示例,数据阐述的方式,展现出作者想要体现出的问答元素。
而The Air Travel Information System(ATIS)是一个年代较为久远的经典数据集,由德克萨斯仪器公司在1990年提出。该数据集获取自关系型数据库Official Airline Guide (OAG, 1990),包含27张表以及不到2000次的问询,每次问询平均7轮,93%的情况下需要联合3张以上的表来得到答案,问询的内容涵盖了航班、费用、城市、地面服务等信息。下图是取自该数据集中的一条样例,可以看得出来比之前介绍的数据集都更有难度得多。
图片来自于http://www.aclweb.org/anthology/H90-1021
在深度学习端到端解决方案流行之前,这一领域的解决方案主要是通过高质量的语法树和词典来构建语义解析器,再将自然语言语句转化为相应的SQL。
图片来自于Natural Language Interfaces to Databases
现在的解决方案则主要是端到端与SQL特征规则相结合。以在WikiSQL数据集上的SOTA模型SQLova为例:首先使用BERT对Question和SQL表格进行编码和特征提取,然后根据数据集中SQL语句的句法特征,将预测生成SQL语句的任务解耦为6个子任务,分别是Select-Column、Select-Aggregation、Where-Number、Where-Column、Where-Operation以及Where-Value,不同子任务之间存在一定的依赖关系,最终使用提取到的特征,依次进行6个任务的预测。
图片来自于SQLNet
NL2SQL的未来
WikiSQL数据集虽然是目前规模最大的有监督数据集,但其数据形式和难度过于简单:对于SQL语句,条件的表达只支持最基础的>、<、=,条件之间的关系只有and,不支持聚组、排序、嵌套等其它众多常用的SQL语法,不需要联合多表查询答案,真实答案所在表格已知等诸多问题的简化,所以在这个数据集上,SQL执行结果的准确率目前已经达到了91.8%。
但同时存在一个问题,这样的数据集并不符合真实的应用场景。在真实的场景中,用户问题中的值非常可能不是数据表中所出现的,需要一定的泛化才可以匹配到;真实的表之间存在错综复杂的键关联关系,想要得到真实答案,通常需要联合多张表进行查询;每一张都有不同的意义,并且每张表中列的意义也都不同,甚至可能相同名字的列,在不同的表格中所代表的含义是不同的;真实场景中,用户的问题表达会很丰富,会使用各种各样的条件来筛选数据。诸如此类的实际因素还有很多。因此,WikiSQL数据集起到的作用更多程度上是抛砖引玉,而不具备实际应用场景落地的价值。
相比之下,Spider等数据集更贴近于真实应用场景:涉及到查询语句嵌套、多表联合查询、并且支持几乎所有SQL语法的用法,用户问句的表达方式和语义信息也更丰富。但即使作者们考虑到数据集的难度,贴心地将数据集按照难度分为简单、中等和困难,数据集的难度也依然让人望而生畏,目前各项指标也都很低。
如何更好地结合数据库信息来理解并表达用户语句的语义、数据库的信息该如何编码及表达、复杂却有必要的SQL语句该如何生成,类似此类的挑战还有很多需要解决,都是非常值得探索的方向。
首届中文NL2SQL大赛来袭
听了上面的介绍,对NL2SQL是不是有点怦然心动?
为了推动NLP在数据库交互上的创新研究和普惠应用,追一科技将在6月份发起首届中文NL2SQL挑战赛,大赛将向海内外高校在校学生、开发者开放。不断挖掘NLP技术的研究潜力,丰富智能语义交互的应用场景。
当然,还有神秘大咖指导,以及丰厚奖金。
六月等你!
(点击阅读原文,参与知乎NL2SQL讨论)
Resource List
Dataset:
WikiSQL,https://github.com/salesforce/WikiSQL
Spider,https://yale-lily.github.io/spider
ATIS,https://www.kaggle.com/siddhadev/ms-cntk-atis
WikiTableQuestions,https://github.com/ppasupat/WikiTableQuestions
Code:
SQLova,https://github.com/naver/sqlova
SQLNet,https://github.com/xiaojunxu/SQLNet
SyntaxSQL,https://github.com/taoyds/syntaxsql
其它相关:
Text2SQL资源汇总
https://github.com/jkkummerfeld/text2sql-data
NLIDB背景
http://jonaschapuis.com/2017/12/natural-language-interfaces-to-databases-nlidb/
ACL Semantic Parsing Tutorial
https://github.com/allenai/acl2018-semantic-parsing-tutorial
相关阅读
● 关于追一
追一科技是国内领先的智能语义公司,一站式企业智能服务平台,主攻深度学习和自然语言处理,为金融、互联网、新零售消费、生活服务、酒旅、能源、政企、运营商等领域的数百家行业标杆企业提供AI解决方案。
商务合作:yi_partner@wezhuiyi.com
简历请投:recruit@wezhuiyi.com
媒体采访:pr@wezhuiyi.com
官网:zhuiyi.ai